package com.java.base.exercise.threadpool;

import org.junit.Test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Author RenPu
 * @Date 2021/7/3 14:37
 * @Version 1.0
 * @Description: 线程池的组成部分：
 * 1：线程的容器
 * 2：任务队列（异步）
 * 3：核心线程数
 * 4：线程最大值
 * 5：存活周期
 * 6: 线程工厂
 * 7：任务策略
 * 线程池处理任务的大致流程：当一个任务被提交到线程池：
 * 1首先先检查线程池的核心参数+任务队列是否已经达到上限，如果同时达到创建新的线程来处理（当创建的线程数量，达到线程最大值时，由任务的策略来处理）
 * 2 首先先检查线程池的任务队列是否已经达到上限，而核心线程数未达到上限将有核心线程处理（不会创建新的线程）
 * 3首先先检查线程池的核心线程数是否已经达到上限，而任务队列未达到上限将放进任务队列等待处理（不会创建新的线程）
 **/
public class ThreadPool_001 {


    /**
     * 场景：文件以word的形式，上传到服务器上，每当用户请求的时候，
     * 需要先将word转化为pdf（消耗一定的时长），用户才可以查看再用户等待期间
     * 界面会一直显示请稍后.......
     */
    //老的处理方法
    @Test
    public void oldHandle() throws InterruptedException {


        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                System.out.println("word开始转化为pdf,请稍后......");
                try {
                    Thread.sleep(10L * 30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("文档处理结束......当前执行线程为：" + Thread.currentThread().getName());


            }).start();
        }

        //主线程睡眠（等待）的时长要比线程睡眠的时间长；
        Thread.sleep(100 * 100);
    }


    @Test
    public void newHandle() throws InterruptedException {
        //创建线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);

        for (int i = 0; i < 100; i++) {
            threadPool.execute(() -> {
                System.out.println("word开始转化为pdf,请稍后......");
                try {
                    Thread.sleep(10L * 10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("文档处理结束......" + Thread.currentThread().getName());


            });
            //主线程睡眠（等待）的时长要比线程睡眠的时间长；
            Thread.sleep(20 * 10);

        }
    }


}
